/**
 * 数据源配置接口
 */
export interface DataSourceConfig {
  /** 数据源唯一标识 */
  id: string;
  /** 数据源名称 */
  name: string;
  /** 数据源描述 */
  description: string;
  /** 基础URL */
  baseUrl: string;
  /** 是否启用 */
  enabled: boolean;
  /** 数据源类型 */
  type: 'components' | 'templates' | 'charts' | 'docs';
  /** 抓取配置 */
  scraping: ScrapingConfig;
  /** 数据处理配置 */
  processing: ProcessingConfig;
  /** 特定配置，不同数据源可能有不同的配置 */
  specific?: Record<string, any>;
}

/**
 * 抓取配置
 */
export interface ScrapingConfig {
  /** 列表页面配置 */
  listPage: {
    /** 列表页面路径 */
    path: string;
    /** 备用路径 */
    fallbackPaths?: string[];
    /** 列表项选择器 */
    itemSelector: string;
    /** 链接选择器 */
    linkSelector: string;
    /** 名称选择器 */
    nameSelector: string;
    /** 分类选择器 */
    categorySelector?: string;
  };
  /** 详情页面配置 */
  detailPage: {
    /** 详情页面路径模式 */
    pathPattern: string;
    /** 标题选择器 */
    titleSelectors: string[];
    /** 描述选择器 */
    descriptionSelectors: string[];
    /** 代码示例选择器 */
    codeSelectors: string[];
    /** 属性表格选择器 */
    propsTableSelectors: string[];
  };
  /** 速率限制（毫秒） */
  rateLimitDelay: number;
  /** 重试配置 */
  retry: {
    maxRetries: number;
    retryDelay: number;
  };
}

/**
 * 数据处理配置
 */
export interface ProcessingConfig {
  /** 组件分类映射 */
  categoryMapping: Record<string, string>;
  /** 默认描述模板 */
  defaultDescriptions: Record<string, string>;
  /** 标签生成规则 */
  tagRules: TagRule[];
  /** 数据验证规则 */
  validation: {
    /** 必需字段 */
    requiredFields: string[];
    /** 字段长度限制 */
    fieldLimits: Record<string, { min?: number; max?: number }>;
  };
  /** 导入信息配置 */
  imports: {
    /** 默认导入路径 */
    defaultPath: string;
    /** 导入名称模式 */
    namePattern: string;
    /** 是否默认导入 */
    isDefault: boolean;
  };
}

/**
 * 标签规则
 */
export interface TagRule {
  /** 规则类型 */
  type: 'name' | 'category' | 'description' | 'feature';
  /** 匹配模式 */
  pattern: string | RegExp;
  /** 生成的标签 */
  tags: string[];
  /** 权重（用于排序） */
  weight?: number;
}

/**
 * 抓取策略接口
 */
export interface ScrapingStrategy {
  /** 策略名称 */
  name: string;
  /** 是否匹配该配置 */
  matches(config: DataSourceConfig): boolean;
  /** 执行抓取 */
  scrape(): Promise<ScrapingResult>;
}

/**
 * 抓取结果接口
 */
export interface ScrapingResult {
  success: boolean;
  count: number;
  data: any[];
  errors: string[];
  timestamp: Date;
  duration: number;
}

/**
 * 数据处理器接口
 */
export interface DataProcessor {
  /** 处理器名称 */
  name: string;
  /** 是否支持该数据类型 */
  supports(type: string): boolean;
  /** 处理数据 */
  process(data: any, config: ProcessingConfig): any;
}